package net.sansi.v3correctserver.util;

import net.sansi.v3correctserver.entity.IntPoint;
import net.sansi.v3correctserver.entity.color.PhotoColor;
import net.sansi.v3correctserver.entity.image.RecCmmImage;

import java.awt.*;

/**
 * Created by Fang
 * create time : 2024/12/27
 * IDE : IntelliJ IDEA
 * <p>
 * 矩阵工具
 */

public class MatrixUtil {

    public interface ToMatrixImageColor<T> {
        PhotoColor getColor(T value);
    }

    static Color[] lt0Colors = new Color[]{
            new Color(255, 255, 255), // 浅绿色
            new Color(197, 236, 197), // 浅绿色
            new Color(133, 210, 133),     // 中深绿色
            new Color(70, 157, 22), // 浅蓝色
            new Color(24, 65, 0), // 浅蓝色
            new Color(73, 73, 218), // 浅蓝色
            new Color(11, 11, 114), // 浅蓝色
    };

    static Color[] gt0Colors = new Color[]{
            new Color(255, 255, 255), // 浅红色
            new Color(239, 182, 193), // 浅红色
            new Color(255, 130, 171), // 中浅红色
            new Color(225, 49, 49),     // 中红色
            new Color(140, 0, 54),     // 中红色
            new Color(213, 89, 43),     // 中红色
            new Color(126, 42, 11),     // 中红色
    };

    /**
     * 将矩阵转换为图片
     *
     * @param size               每个像素的尺寸
     * @param matrix             矩阵
     * @param toMatrixImageColor 颜色取样
     * @param <T>                类型
     * @return 图片
     */
    public static <T> RecCmmImage toMatrixImage(int size, Matrix<T> matrix, ToMatrixImageColor<T> toMatrixImageColor) {
        int w = matrix.getWidth(), h = matrix.getHeight();
        int iw = w * size + w + 1, ih = h * size + h + 1;
        RecCmmImage res = new RecCmmImage(iw, ih);
        res.setBackgroundColor(new PhotoColor(0, 0, 0));
        matrix.foreach((x, y, item) -> {
            res.fillRect(
                    new IntPoint((x * size + x + 1), (y * size + y + 1)),
                    new IntPoint((x * size + x + size), (y * size + y + size)),
                    toMatrixImageColor.getColor(item)
            );
        });
        return res;
    }

    /**
     * 将矩阵转换为图片
     * 自动应用百分比
     *
     * @param base   基准值
     * @param size   每个像素的尺寸
     * @param unit   单位跨度
     * @param matrix 矩阵
     * @return 图片
     */
    public static RecCmmImage toMatrixImageByPercentColor(
            double base, int size, double unit,
            Matrix<Double> matrix) {
        return toMatrixImage(size, matrix, (item) -> {
            double diff = item - base;
            int colorIdx = Math.abs((int) Math.floor(diff / unit));
            Color[] colors = diff >= 0 ? gt0Colors : lt0Colors;
            return new PhotoColor(colors[Math.min(colors.length - 1, colorIdx)]);
        });
    }

}
